package foundation.SurModel.rndForest;

import java.util.ArrayList;
import java.util.List;

import foundation.SurModel.rndForest.sample.ConverterData;
import foundation.SurModel.rndForest.sample.PerfLearnTblItem;
import weka.core.Instances;

public class Predictor {
	

	public ArrayList<ArrayList<Double>> predStrToDoubLi(List<StringBuffer> mlDFcodes){
		ArrayList<ArrayList<Double>> data = new ArrayList<ArrayList<Double>>();
		ArrayList<Double> dataMeta = new ArrayList<>();
		for(int i=0;i<mlDFcodes.size();i++){
			dataMeta.add(Double.parseDouble(mlDFcodes.get(i).toString()));
		}
		dataMeta.add(-1d);
		data.add(dataMeta);
		
		return data;
	}
	
	/**
	 * 预测最大使用率处理器的编号
	 * @param mlTbl:机器学习表
	 * @param mlDFcodes：处理器速度为float类；服务器名为编号；组件选择中组件名为编号
	 * @return
	 */
	
	public int predictMaxProUtil(List<StringBuffer> mlDFcodes) throws Exception {
		//将mlDFcodes变换成一个Instances
		ArrayList<ArrayList<Double>> data  = predStrToDoubLi(mlDFcodes);
		Instances predInstances = ConverterData.converterData(PerfLearnTblItem.getAttrs(), data);
		//指定要进行预测的数据的一个序列中的预测索引
		predInstances.setClassIndex(predInstances.numAttributes() - 1);
		/*
		 * 得到预测值，并且将其返回
		 */
		int  predictMaxUtilProcNo = Math.round((float)(Trainer.maxProUtilTrainer.classifyInstance(predInstances.instance(0))));
		return predictMaxUtilProcNo;
	}
	/**
	 * 预测最小使用率处理器的编号
	 * @param mlTbl:机器学习表
	 * @param mlDFcodes：处理器速度为float类；服务器名为编号；组件选择中组件名为编号
	 * @return
	 * @throws Exception 
	 */
	public int predictMinProUtil(List<StringBuffer> mlDFcodes) throws Exception {
		//将mlDFcodes变换成一个Instances
		ArrayList<ArrayList<Double>> data  = predStrToDoubLi(mlDFcodes);
		Instances predInstances = ConverterData.converterData(PerfLearnTblItem.getAttrs(), data);
		//指定要进行预测的数据的一个序列中的预测索引
		predInstances.setClassIndex(predInstances.numAttributes() - 1);
		/*
		 * 得到预测值，并且将其返回
		 */
		int  predictMinUtilProcNo = Math.round((float)(Trainer.minProUtilTrainer.classifyInstance(predInstances.instance(0))));
		return predictMinUtilProcNo;
	}

	/**
	 * 预测响应时间值
	 * @param mlTbl:机器学习表
	 * @param mlDFcodes：处理器速度为float类；服务器名为编号；组件选择中组件名为编号
	 * @throws Exception 
	 */
	public float predictRest(List<StringBuffer> mlDFcodes) throws Exception {
		//将mlDFcodes变换成一个Instances
		ArrayList<ArrayList<Double>> data  = predStrToDoubLi(mlDFcodes);
		Instances predInstances = ConverterData.converterData(PerfLearnTblItem.getAttrs(), data);
		//指定要进行预测的数据的一个序列中的预测索引
		predInstances.setClassIndex(predInstances.numAttributes() - 1);
		/*
		 * 得到预测值，并且将其返回
		 */
		float  predictRest = (float)(Trainer.restTrainer.classifyInstance(predInstances.instance(0)));
		return predictRest;
	}
	/**
	 * 预测可靠性值
	 * @param mlTbl:机器学习表
	 * @param mlDFcodes：处理器速度为float类；服务器名为编号；组件选择中组件名为编号
	 */
	public float predictRelb(List<StringBuffer> mlDFcodes) {
		// 注意要写mlTbl表
		return -1f;
	}
}
